//
// Created by A on 2024/6/21.
//

#ifndef GAME_SPIRIT_H
#define GAME_SPIRIT_H
#include "stdint.h"
#include "mLink.h"

enum Mspirit_key{
    leader=1,
    map=10000
};
typedef struct {
    uint32_t key; //精灵唯一识别码 用于指示精灵是什么 一种精灵一个码
    uint8_t  crash_group; //碰撞组
//三维属性等

}Attribute;//属性


typedef enum { //精灵状态
    null_satus=0,
    idle,           //空闲
    run,              //运动
    inter,            //交互
    appear,           //出现
    death,            //死亡
    attack,           //攻击
}Allstatus;

typedef struct{//精灵位置相关信息
    int x, y; //绝对位置
    int grc_x, grc_y; //相对位置
    int w, h;
} Spirit_Rect;


typedef struct{//精灵装备相关
    int head;
    int trunk;
}Weapon;


typedef struct{//动画
    Spirit_Rect original_Rect;             //裁剪位置
    uint32_t delat_time;                   //下一帧等待时间 如果delat_time==StaticTime代表禁止无动画
    void * resoures;                       //资源位置 转换为SDL_Texture
}Animation_frame;
typedef struct {
    int type;  //对应八种动画中的哪一种
    int frame_num[8];  //多少帧  一个状态可以有八种动画
  Animation_frame *framedata[8]; //帧数据
}Animation;
typedef struct{
    Animation idle;            //空闲动画
    Animation run;             //运动动画
    Animation inter;           //交互动画
    Animation appear;          //出现动画
    Animation death;           //死亡动画
    Animation attack;          //攻击动画
}AllAnimation;



typedef struct {
    int Crash_group; //碰撞组 同组不检测碰撞

}Crash;//碰撞





class Mspirit{
public:
    Attribute attribute;  //属性
    Allstatus Status; //精灵状态
    Spirit_Rect Rect;        //当前位置 大小
    Weapon weapon;   //武器装备
    AllAnimation mation; //动画
    void Mspirit_run();//精灵状态改变调用
private:
    uint64_t spirit_clock=0;
    Allstatus last_status=null_satus;
    uint32_t frame=0;
    int Dspeed_Y=0;
    int Dspeed_X=0;
};
/**
 * 考虑是否使用构造函数生成，或者分段 npc段有一张表维护 固定不变，可刷新精灵就随机
 * 0-99     leader
 * 100-9999 npc
 * 10000-99999   monster(暂定)
 * */

#define LEADER_LIMIT  99
#define NPC_LIMIT     9999
#define MONSTER_LIMIT 99999

typedef enum {
    LEADER_KEY=1,
    NPC_KEY,
    MONSTER_KEY
}Spirit_TYPE;

int Mspirit_joinLink(Mspirit *ptr,LNode* pnode);
int Mspirit_deleteLink(uint32_t spirit_key,LNode* pnode);


int Mspirit_Linkrun(LNode* pnode);

#endif //GAME_SPIRIT_H
